# 用numpy和matplotlib完成以下画图
# 1. 在0-2pi的范围内画出sin和cos曲线，使用不同的颜色并标出图例
# 2. 生成20个随机的二维点，显示出散点图。然后对x和y分别进行规范化(standardized)，再显示出散点图
# 3. 给出一列数据e.g[0.12, 0.1231, 0.991, -0.123, .....]计算他的均值和方差，并用这组均值和方差画出一个[均值-1， 均值+1]的柱状图，柱宽为0.1
# 进阶：怎么在同一张图上画出两个不同的维度的折线？比如想要呈现latency和throughout随concurrency的变化过程
# 但latency可能是万这个量级（假设），而throughout只是百这个量级

import numpy as np
import matplotlib.pyplot as plt

# 1. 在0-2pi的范围内画出sin和cos曲线，使用不同的颜色并标出图例
x = np.linspace(0, 2 * np.pi, 100)
y_left = np.sin(x)
y_right = np.cos(x)

plt.plot(x, y_left, 'r-', label='sin')
plt.plot(x, y_right, 'b-', label='cos')
plt.legend(loc='best')
plt.show()

# 2. 生成20个随机的二维点，显示出散点图。然后对x和y分别进行规范化(standardized)，再显示出散点图
x = np.random.randn(20)
y = np.random.randn(20)
plt.scatter(x, y, label='original')

x_stand = (x - np.min(x)) / (np.max(x)-np.min(x))
y_stand = (y - np.min(y)) / (np.max(y)-np.min(y))
plt.scatter(x_stand, y_stand, label='standardized')
plt.legend(loc='best')
plt.show()

# 3. 给出一列数据e.g[0.12, 0.1231, 0.991, -0.123, .....]计算他的均值和方差，并用这组均值和方差画出一个[均值-1， 均值+1]的柱状图，柱宽为0.1
data = [0.12, 0.1231, 0.991, -0.123]
mean = np.mean(data)
std = np.std(data)
print(mean)
print(std)
x = [mean - 1, mean, mean + 1]
y = [1, 1, 1]
plt.bar(x, y, width=0.1)

plt.legend(loc='best')
plt.show()

# 同一张图上画出两个不同的维度的折线？比如想要呈现latency和throughout随concurrency的变化过程
# 但latency可能是万这个量级（假设），而throughout只是百这个量级
x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8])
# 创建双Y轴
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.set_xlabel('Threads(number)')

# 在左轴画latency
y1 = np.array([0, 25, 36, 55, 37, 46, 53, 59, 64])  # p90 latency
ax1.plot(x, y1, 'g-', label='p90 Latency(ms)')
ax1.set_ylabel('p90 Latency', color='g')

# 在右轴画throughput
y2 = np.array([0, 54.44, 71.84, 68.42, 140.22, 155.45, 157.07, 159.36, 163.67])  # throughput
ax2.plot(x, y2, 'b-', label='Throughput(doc/s)')

y3 = np.array([0, 74.8, 95.46, 105.18, 330.06, 365.07, 375.10, 377.05, 377.49])
ax2.plot(x, y3, 'r-', label='CPU utilization(%)')
ax2.set_ylabel('Throughput&CPU Utilization', color='b')

# 其他设置
ax1.legend(loc='upper left')
ax2.legend(loc='lower right')
plt.title('Performance Metrics')

# 保存图像到文件
plt.savefig('plot.png', bbox_inches='tight')
# 显示图像
plt.show()
